package com.xiyin.poi.controller;

import com.xiyin.poi.entity.TblUser;
import com.xiyin.poi.service.ITblUserService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/export")
public class ExcelExportController {

    @Autowired
    private ITblUserService iTblUserService;

    @GetMapping("/employees-to-excel")
    public ResponseEntity<byte[]> exportEmployees(HttpServletResponse response) throws IOException {
        // 获取所有员工
        List<TblUser> tblUsers = iTblUserService.selectAll();

        // 创建工作簿
        Workbook workbook = new XSSFWorkbook();

        // 创建工作表
        Sheet sheet = workbook.createSheet("tblUsers");

        // 创建表头行
        Row headerRow = sheet.createRow(0);
        CellStyle headerCellStyle = createHeaderCellStyle(workbook);
        headerRow.createCell(0).setCellValue("ID");
        headerRow.getCell(0).setCellStyle(headerCellStyle);
        headerRow.createCell(1).setCellValue("用户账号");
        headerRow.getCell(1).setCellStyle(headerCellStyle);
        headerRow.createCell(2).setCellValue("用户密码");
        headerRow.getCell(2).setCellStyle(headerCellStyle);
        headerRow.createCell(3).setCellValue("email");
        headerRow.getCell(3).setCellStyle(headerCellStyle);


        // 填充数据
        int rowNum = 1;
        for (TblUser tblUser : tblUsers) {
            Row row = sheet.createRow(rowNum++);
            row.createCell(0).setCellValue(tblUser.getId());
            row.createCell(1).setCellValue(tblUser.getAccount());
            row.createCell(2).setCellValue(tblUser.getPassword());
            row.createCell(3).setCellValue(tblUser.getEmail());
        }

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=tblUsers.xlsx");
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        // 将Workbook转换为字节数组并返回
       /* 该函数的功能是将Workbook对象转换为字节数组，
        并通过RESTful API返回给客户端。
        首先创建一个ByteArrayOutputStream对象baos，
        然后调用workbook的write方法将workbook对象写入到baos中，
        接着通过调用baos的toByteArray方法将字节数组bytes获取并返回。
        最后，使用Spring的ResponseEntity类将转换后的字节数组bytes作为响应体，
        设置响应头headers和内容类型为MediaType.APPLICATION_OCTET_STREAM，
        并通过RESTful API返回给客户端*/
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        workbook.write(baos);
        byte[] bytes = baos.toByteArray();
        /*ResponseEntity是Spring Framework中用于构建HTTP响应的类，它完全封装了HTTP响应，包括状态码、响应头和响应体。在上述代码片段中：
ResponseEntity.ok() 创建了一个带有HTTP 200（成功）状态码的响应实体。
.headers(headers) 方法用来设置HTTP响应头信息，这里的headers是一个包含自定义头部信息的对象。
.contentType(MediaType.APPLICATION_OCTET_STREAM) 设置HTTP响应的内容类型为“application/octet-stream”，表示返回的是二进制流数据，通常用于文件下载等场景。
.body(bytes) 将字节数组bytes作为HTTP响应的主体内容。
综上所述，该函数通过ResponseEntity将转换后的Workbook对象字节数组以HTTP响应的形式发送给客户端，并告知客户端这是一个二进制流数据，以便正确解析和处理*/
        return ResponseEntity.ok()
                .headers(headers)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(bytes);
    }

    private static CellStyle createHeaderCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setFont(font);
        return style;
    }
}
